<?php
namespace backend\controllers;

use Yii;
use yii\data\Pagination;
use common\models\Game;
use common\models\GameType;
use common\models\GameState;
use common\models\GameWithType;
use common\models\GameInfo;
use common\models\GameNotice;

/**
 * 游戏管理
 *
 * @author jois
 */
class GameController extends BaseController
{

    /**
     * 游戏列表页
     */
    public function actionIndex()
    {
        // 所有一级游戏类型
        $types = GameType::topNode()->all();

        // 所有游戏状态
        $states = GameState::find()->all();

        $input = Yii::$app->request->get();
        // 根据参数获取信息
        if (! empty($input['key'])) {
            $query = Game::find()->with('types')->where("game_name like '%" . $input['key'] . "%'");
        } else {
            $query = Game::find()->with('types');
        }
        // 根据类型参数过滤游戏
        if (! empty($input['type_id'])) {
            // 取得这个类型及旗下所有子级类型
            $child_nodes = GameType::findOne($input['type_id'])->childNodes(true)->column();
            // 取得这些类型包含的游戏ID
            $game_ids = GameWithType::find()->select([
                'game_id'
            ])
                ->where([
                'in',
                'type_id',
                $child_nodes
            ])
                ->column();
            $query->andWhere([
                'in',
                'game_id',
                $game_ids
            ]);

            // TODO:用此方法无法实现，有待研究，sql语句会多出and 0=1的条件
            // $query = $query->with([
            // 'types' => function ($q) use($child_nodes)
            // {
            // $q->andWhere([
            // 'in',
            // 'type_id',
            // $child_nodes
            // ]);
            // }
            // ]);
        }

        // 根据状态参数过滤游戏
        if (! empty($input['state_id'])) {
            $query->andWhere('state_id=:state_id')->addParams([
                ':state_id' => $input['state_id']
            ]);
        }

        // 根据排序抓取分页列表数据
        if (! empty($input['score'])) {
            $query->orderBy("score {$input['score']}");
        } elseif (! empty($input['sort_num'])) {
            $query->orderBy("sort_num {$input['sort_num']}");
        } elseif (! empty($input['game_id'])) {
            $query->orderBy("game_id {$input['game_id']}");
        } else {
            $query->orderBy("sort_num desc");
        }
        $countQuery = clone $query;

        // 分页处理
        $pages = new Pagination([
            'totalCount' => $countQuery->count()
        ]);
        $models = $query->offset($pages->offset)
            ->limit($pages->limit)
            ->all();

        return $this->render('index', compact('models', 'pages', 'types', 'states'));
    }

    /**
     * 添加及编辑游戏
     */
    public function actionEdit()
    {
        // 所有一级游戏类型
        $types = GameType::topNode()->all();

        // 所有游戏状态
        $states = GameState::find()->all();

        $model = null;
        $this_game_types = $this_game_types_id = [];
        $id = Yii::$app->request->get('game_id', 0);
        if ((int) $id > 0) {
            $model = Game::findOne((int) $id);

            // 修改时，找出这个游戏对应的类型，并且进行每行循环，每行中包括第一级的到此最后节点的遍历
            $game_types = GameWithType::find()->select("type_id")
                ->where("game_id=:game_id")
                ->addParams([
                "game_id" => $model->game_id
            ])
                ->column();
            foreach ($game_types as $key => $item) {
                $pid = GameType::findOne($item);
                $path = $pid->path;
                $path_ids = array_filter(explode(':', $path));
                foreach ($path_ids as $key2 => $dd) {
                    // 找出这个当前级的所有分类
                    $parent_path = GameType::findOne($dd)->parent_path;
                    $this_game_types[$key][$key2] = GameType::find()->where("parent_path=:parent_path")
                        ->addParams([
                        'parent_path' => $parent_path
                    ])
                        ->asArray()
                        ->all();
                    $this_game_types_id[$key][$key2] = $dd;
                }
            }
        }

        return $this->render('edit', compact([
            'model',
            'types',
            'states',
            'this_game_types',
            'this_game_types_id'
        ]));
    }

    /**
     * 保存游戏
     */
    public function actionSave()
    {
        $post = Yii::$app->request->post();
        // 验证
        if (Yii::$app->request->isPost && ! empty($post)) {
            Yii::$app->session->setFlash('post', $post);
            // 获取类型最终值
            $type = array_flatten(array_unique(array_filter($post['type'])));
            // 去除分类中有子类的父类，并赋值于游戏类型字段，保存到关系表game_with_type
            $new_type_ids = $type;
            foreach ($type as $key1 => $cid1) {
                $cids = GameType::findOne($cid1)->childNode()->column();
                foreach ($type as $key2 => $cid2) {
                    if (in_array($cid2, $cids)) {
                        unset($new_type_ids[$key1]);
                    }
                }
            }
            if (empty($new_type_ids)) {
                Yii::$app->session->setFlash('message_error', '请选择游戏的所属类型');
                return $this->redirect(Yii::$app->request->referrer);
            }

            // 保存数据
            $game = isset($post['game_id']) ? Game::findOne([
                'game_id' => (int) $post['game_id']
            ]) : new Game();

            // 赋值状态名state_name字段
            $post['state_name'] = GameState::findOne($post['state_id'])->state_name;
            // 赋值首字母pinyin_first_letter字段
            $post['pinyin_first_letter'] = substr(trim($post['pinyin']), 0, 1);

            $game->attributes = $post;
            $game->save();

            // 验证数据
            if (! empty($game->getErrors())) {
                Yii::$app->session->setFlash('message_error', $game->getErrors());
                return $this->redirect(Yii::$app->request->referrer);
            }

            // 保存游戏类型，保存前先删除原来的关系
            // TODO:用link的写法无法实现game_name和type_name也插入到game_with_type表,多对多的关系配置还不够强大
            GameWithType::deleteAll('game_id=:game_id', [
                'game_id' => $game->game_id
            ]);

            foreach ($new_type_ids as $type_id) {
                $game_type = GameType::findOne($type_id);
                // $game_type->link('games', $game);
                $game_with_type = new GameWithType();
                $game_with_type->game_id = $game->game_id;
                $game_with_type->game_name = $game->game_name;
                $game_with_type->type_id = $type_id;
                $game_with_type->type_name = $game_type->type_name;
                $game_with_type->save();
            }
            // 成功返回200
            Yii::$app->session->setFlash('message_success', isset($post['game_id']) ? '编辑成功！' : '添加成功！');
            $session = Yii::$app->session;
            unset($session['post']);
            return $this->redirect('/game/index', 200);
        }
        throw new \yii\web\MethodNotAllowedHttpException('操作异常，不支持非post提交保存数据');
        return false;
    }

    /**
     * 信息INfo修改
     */
    public function actionEditInfo()
    {
        $game_id = (int) Yii::$app->request->get('game_id');
        if ($game_id > 0) {
            $model = GameInfo::findOne($game_id);
            return $this->render('edit-info', compact('model'));
        }
        Yii::$app->session->setFlash('message_error', '非法访问');
        return $this->redirect(Yii::$app->request->referrer);
    }

    /**
     * 信息info保存
     */
    public function actionSaveInfo()
    {
        $post = Yii::$app->request->post();
        // 验证
        if (Yii::$app->request->isPost && ! empty($post)) {
            // 保存数据
            $game_info = GameInfo::findOne((int) $post['game_id']);
            $game_info->attributes = $post;
            $game_info->save();

            // 验证数据
            if (! empty($game_info->getErrors())) {
                Yii::$app->session->setFlash('message_error', $game_info->getErrors());
                return $this->redirect(Yii::$app->request->referrer);
            }

            // 成功返回200
            Yii::$app->session->setFlash('message_success', isset($post['game_id']) ? '编辑成功！' : '添加成功！');
            return $this->redirect('/game/index', 200);
        }
        throw new \yii\web\MethodNotAllowedHttpException('操作异常，不支持非post提交保存数据');
        return false;
    }

    /**
     * 游戏公告指派所属游戏时的搜索
     */
    public function actionSearchByNotice()
    {
        // 取得数据及模型。
        $game_notice_id = Yii::$app->request->get('game_notice_id', 0);
        $key = Yii::$app->request->get('modal_key', '');
        $state_id = Yii::$app->request->get('state_id', 0);
        $game_notice = GameNotice::findOne($game_notice_id);

        // 验证数据
        if (is_object($game_notice)) {
            $data = Game::find()->orderBy("sort_num desc");
            // 处理筛选条件。
            if (! empty($key)) {
                $data->where("game_name like '%" . $key . "%'");
            }
            if ($state_id > 0) {
                $data->where("state_id=:state_id", [
                    "state_id" => $state_id
                ]);
            }

            // 返回数据。
            $data = $data->all();
            return $this->renderPartial('modal_game_list_by_notice', compact('data', 'game_notice_id'));
        }
        Yii::$app->session->setFlash('message_error', '操作异常，参数获取失败');
        return $this->redirect(Yii::$app->request->referrer);
    }

    /**
     * 游戏系数指派所属游戏时的搜索
     */
    public function actionSearchByBeta()
    {
        // 取得数据及模型。
        $key = Yii::$app->request->get('modal_key', '');
        $state_id = Yii::$app->request->get('state_id', 0);

        // 验证数据
        $data = Game::find()->orderBy("sort_num desc");
        // 处理筛选条件。
        if (! empty($key)) {
            $data->where("game_name like '%" . $key . "%'");
        }
        if ($state_id > 0) {
            $data->where("state_id=:state_id", [
                "state_id" => $state_id
            ]);
        }

        // 返回数据。
        $data = $data->all();
        return $this->renderPartial('modal_game_list_by_beta', compact('data'));
    }

    /**
     * 游戏版本指派所属游戏时的搜索
     */
    public function actionSearchByVersion()
    {
        // 取得数据及模型。
        $key = Yii::$app->request->get('modal_key', '');
        $state_id = Yii::$app->request->get('state_id', 0);

        // 验证数据
        $data = Game::find()->orderBy("sort_num desc");
        // 处理筛选条件。
        if (! empty($key)) {
            $data->where("game_name like '%" . $key . "%'");
        }
        if ($state_id > 0) {
            $data->where("state_id=:state_id", [
                "state_id" => $state_id
            ]);
        }

        // 返回数据。
        $data = $data->all();
        return $this->renderPartial('modal_game_list_by_version', compact('data'));
    }
}
